home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / gpen32k / source / lib / osrc / menu256.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-01  |  4.2 KB  |  220 lines

  1. /*
  2.             Towns Menu-Bar 256 v0.001
  3.                             Copyright(C) 1993 Okome
  4. */
  5.  
  6. #include    <string.h>
  7. #include    <EGB.H>
  8. #include    <MOS.H>
  9. #include    <normlib.h>
  10. #include    <okome.h>
  11. #include    <col256.h>
  12.  
  13. extern char work[];
  14. extern char *MEN_title[];
  15. extern int MEN_kazu[];
  16. static int mex[16], mel[16], ebf;
  17.  
  18. static int ml( int i )
  19. {
  20.     int k, l=0;
  21.     for (k=0; k<=i; k++)
  22.         l+=MEN_kazu[k];
  23.     return (l);
  24. }
  25.  
  26. static int ubs( int i, int m )
  27. {
  28.     static int j=-1, n=0;
  29.     int k, l, y;
  30.     char b[640];
  31.     if (j != i)
  32.     {
  33.         if (j >= 0)
  34.         {
  35.             ubox2( mex[j], 0, mex[j+1]-1, 19, col15, col8 );
  36.             for ( y=20; y<=23+MEN_kazu[j+1]*19; y++ )
  37.             {
  38.                 egbget( 640, y, 640+mel[j], y, b);
  39.                 egbput( mex[j], y, mex[j]+mel[j], y, b);
  40.             }
  41.         }
  42.         j = i;
  43.         n = 0;
  44.         if (i >= 0)
  45.         {
  46.             ubox2( mex[i], 0, mex[i+1]-1, 19, (i!=0)*col1, (i!=0)*col1 );
  47.             for ( y=20; y<=23+MEN_kazu[i+1]*19; y++ )
  48.             {
  49.                 egbget( mex[j], y, mex[j]+mel[j], y, b);
  50.                 egbput( 640, y, 640+mel[j], y, b);
  51.             }
  52.             boxbf( mex[i], 20, mex[i]+mel[i], 23+MEN_kazu[i+1]*19, col8,col15);
  53.             boxb( mex[i], 20, mex[i]+mel[i]-1, 22+MEN_kazu[i+1]*19, col8 );
  54.             boxb( mex[i], 20, mex[i]+mel[i]-2, 21+MEN_kazu[i+1]*19, col8 );
  55.             l = ml(i);
  56.             for (k=0; k<MEN_kazu[i+1]; k++)
  57.             {
  58.                 symbol( mex[i]+8, 37+k*19, MEN_title[l+k], 16, col8 );
  59.             }
  60.         }
  61.     }
  62.     if ( i>=0 )
  63.     {
  64.         if ( m!=n )
  65.         {
  66.             EGB_writeMode( work, 4 );
  67.             if (n>0)
  68.             {
  69.                 boxf( mex[i]+1, n*19+2, mex[i]+mel[i]-3, n*19+20, col15 );
  70.             }
  71.             if (m>0)
  72.             {
  73.                 boxf( mex[i]+1, m*19+2, mex[i]+mel[i]-3, m*19+20, col15 );
  74.             }
  75.             EGB_writeMode( work, 0 );
  76.             n = m;
  77.         }
  78.         if (m > 0)
  79.         {
  80.             return (i*100+m);
  81.         }
  82.     }
  83.     return (0);
  84. }
  85.  
  86. static int menx(int mx)
  87. {
  88.     int i = 1;
  89.     while ( mex[i] <= mx )
  90.         i++;
  91.     return (i-1);
  92. }
  93.  
  94. static int mebox( int mb, int k )
  95. {
  96.     int i = 0, j, mx, my, l;
  97.     l = k*23;
  98.     while (mb != 0)
  99.     {
  100.         MOS_rdpos( &mb, &mx, &my );
  101.         j=i;
  102.         i = ( mx >= 610-l && mx <=629-l && my < 20 ) ? 1 : 0 ;
  103.         if (j!=i)
  104.         {
  105.             MOS_disp( 0 );
  106.             ubox2( 610-l, 0, 629-l, 19, 255-i*255, col8 );
  107.             MOS_disp( 1 );
  108.         }
  109.     }
  110.     MOS_disp( 0 );
  111.     ubox2( 610-l, 0, 629-l, 19, col15, col8 );
  112.     MOS_disp( 1 );
  113.     return (i);
  114. }
  115.  
  116. int MEN_menu256( int mb, int mx, int my )
  117. {
  118.     int p, i, r = 0, j = -1, z = 1, mb2;
  119.     p = EGB_getWritePage( 0, 0 );
  120.     EGB_writePage( work, 0 );
  121.     if ( mb && mex[MEN_kazu[0]] > mx && my < 20 )
  122.     {
  123.         while ( z != 0 )
  124.         {
  125.             mb2 = mb;
  126.             MOS_rdpos( &mb, &mx, &my );
  127.             if ( mex[MEN_kazu[0]] > mx && my < 20 )
  128.             {
  129.                 if ( mb )
  130.                 {
  131.                     i = menx(mx);
  132.                     if ( j!=i || r )
  133.                     {
  134.                         MOS_disp( 0 );
  135.                         r = ubs( i, 0 );
  136.                         MOS_disp( 1 );
  137.                         j = i;
  138.                     }
  139.                     z = 2;
  140.                 }    else    {
  141.                     z = 1;
  142.                 }
  143.             }
  144.             if ( mex[j] <= mx && mex[j]+mel[j] >= mx &&
  145.                  20 < my && my < 21 + MEN_kazu[j+1] * 19 )
  146.             {
  147.                 if (mb!=0)
  148.                 {    /*    SUB menuの処理    */
  149.                     i = (my - 21) / 19;
  150.                     MOS_disp( 0 );
  151.                     r = ubs( j, i+1 );
  152.                     MOS_disp( 1 );
  153.                     z = 3;
  154.                 }    else    {
  155.                     if ( z==3 && mb2 )
  156.                     {
  157.                         z = 0;
  158.                     }
  159.                 }
  160.             }    else    {
  161.                 if ( z==3 && mb )
  162.                 {
  163.                     MOS_disp( 0 );
  164.                     r = ubs(j, 0);
  165.                     MOS_disp( 1 );
  166.                     z = 4;
  167.                 }
  168.                 if ( (mex[MEN_kazu[0]] > mx && my < 20)==0 )
  169.                 {
  170.                     if (((z==1) && mb) || ((z==2 || z==4) && mb==0))
  171.                     {
  172.                         z = 0;
  173.                     }
  174.                 }
  175.             }
  176.         }
  177.         MOS_disp( 0 );
  178.         ubs( -1, 0 );
  179.         MOS_disp( 1 );
  180.         do    {
  181.             MOS_rdpos( &mb, &mx, &my );
  182.         }    while( mb != 0 );
  183.     }    else    {
  184.         if ( mx >= 633-23*ebf && mx <= 629 && my < 20 && (629-mx) % 23 < 20)
  185.         {    /*    ENDボタン    */
  186.             i = (629-mx) / 23;
  187.             if (mebox( mb, i ))
  188.                 r = 9999 - i;
  189.         }
  190.     }
  191.     EGB_writePage( work, p );
  192.     return (r);
  193. }
  194.  
  195. void MEN_set256( int b )
  196. {
  197.     int i, j=0, k, l;
  198.     boxbf( 0, 0, 639, 19, 0, col7 );
  199.     ebf = b;
  200.     for (i = 0; i < MEN_kazu[0]; i++)
  201.     {
  202.         j += strlen(MEN_title[i])*8+32;
  203.         mex[i+1] = j;
  204.         boxf( mex[i], 0, j-1, 19, (i!=0)*col1 );
  205.         ubox2( mex[i], 0, j-1, 19, col15, col8 );
  206.         symbol( mex[i]+13, 17, MEN_title[i], 16, col15 );
  207.         l = ml(i);
  208.         for (k=0; k<MEN_kazu[i+1]; k++)
  209.         {
  210.             if ( strlen(MEN_title[l+k])*8+16 > mel[i] )
  211.                 mel[i] = strlen(MEN_title[l+k])*8+18;
  212.         }
  213.     }
  214.     for (i = 0; i < b; i++)
  215.     {
  216.         boxf( 610-i*23, 0, 629-i*23, 19, col8 );
  217.         ubox2( 610-i*23, 0, 629-i*23, 19, col15, col8 );
  218.     }
  219. }
  220.